var QQV = (rule, value, callback) => {

  if (value === '') {
    callback(new Error('输入QQ号'))
  } else if (/^[1-9][0-9]{4,10}$/.test(value)) {
    callback()
  } else {
    callback(new Error('输入正确的QQ号'))
  }
}

// 类似金钱,首位不为0,最多2位小数
export function checkNumPot2(rule, value, callback) {
  const reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/
  if (!value) {
    return callback(new Error('请填写数字'))
  } else if (!reg.test(value)) {
    return callback(new Error('请填写数字,最多2位小数'))
  } else {
    callback()
  }
}

// 身份证
export function checkIdCard(rule, value, callback) {
  const reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
  if (!value) {
    return callback(new Error('证件号码不能为空'))
  } else if (!reg.test(value)) {
    return callback(new Error('证件号码不正确'))
  } else {
    callback()
  }
}

// 整数
export function checkInterNum(rule, value, callback) {
  const reg = /^[0-9]*[1-9][0-9]*$/
  if (!value) {
    return callback(new Error('请填写整数'))
  } else if (!reg.test(value)) {
    return callback(new Error('请输入整数'))
  } else {
    callback()
  }
}

// 不得小于100
export function checkWithdrawNum(rule, value, callback) {
  const regNum = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/
  if (!value) {
    return callback(new Error('请填写提现金额'))
  } else if (!regNum.test(value)) {
    return callback(new Error('提现金额最多2位小数'))
  } else {
    if (value < 100) {
      return callback(new Error('每笔提现金额最低100元起'))
    } else {
      callback()
    }
  }
}

// 必填
export function validateRequire(rule, value, callback) {
  if (value !== undefined && value !== null) {
    if (value.length === 0 || value === false) {
      callback(new Error('此为必填项'))
    } else {
      callback()
    }
  } else {
    callback(new Error('此为必填项'))
  }
}

// 日期起始时间不能大于今天
import { formatDate } from '@/utils/com'
export function validateTimeScope(rule, value, callback) {
  if (value === undefined || value === '' || value === null || value.length === 0) {
    callback(new Error('此为必填项'))
  } else if (value.length > 1) {
    const nowTime = new Date()
    if (value[0] > formatDate(nowTime, 'yyyy-MM-dd')) {
      callback(new Error('起始日期不能大于今日'))
    } else if (value[1] < formatDate(nowTime, 'yyyy-MM-dd')) {
      callback(new Error('结束日期不能小于今日'))
    } else {
      callback()
    }
  }
}

// 银行卡号Luhn校验算法
// luhn校验规则：16位银行卡号（19位通用）:
// 1.将未带校验位的 15（或18）位卡号从右依次编号 1 到 15（18），位于奇数位号上的数字乘以 2。
// 2.将奇位乘积的个十位全部相加，再加上所有偶数位上的数字。
// 3.将加法和加上校验位能被 10 整除。

// value为银行卡号
function luhnCheck(value) {
  // var lastNum = value.substr(value.length - 1, 1) // 取出最后一位（与luhn进行比较）

  // var first15Num = value.substr(0, value.length - 1) // 前15或18位
  // var newArr = []
  // for (var i = first15Num.length - 1 i > -1 i--) { // 前15或18位倒序存进数组
  //   newArr.push(first15Num.substr(i, 1))
  // }
  // var arrJiShu = [] // 奇数位*2的积 <9
  // var arrJiShu2 = [] // 奇数位*2的积 >9

  // var arrOuShu = [] // 偶数位数组
  // for (var j = 0 j < newArr.length j++) {
  //   if ((j + 1) % 2 === 1) { // 奇数位
  //     if (parseInt(newArr[j]) * 2 < 9) { arrJiShu.push(parseInt(newArr[j]) * 2) } else { arrJiShu2.push(parseInt(newArr[j]) * 2) }
  //   } else { // 偶数位
  //     arrOuShu.push(newArr[j])
  //   }
  // }

  // var jishu_child1 = [] // 奇数位*2 >9 的分割之后的数组个位数
  // var jishu_child2 = [] // 奇数位*2 >9 的分割之后的数组十位数
  // for (var h = 0 h < arrJiShu2.length h++) {
  //   jishu_child1.push(parseInt(arrJiShu2[h]) % 10)
  //   jishu_child2.push(parseInt(arrJiShu2[h]) / 10)
  // }

  // var sumJiShu = 0 // 奇数位*2 < 9 的数组之和
  // var sumOuShu = 0 // 偶数位数组之和
  // var sumJiShuChild1 = 0 // 奇数位*2 >9 的分割之后的数组个位数之和
  // var sumJiShuChild2 = 0 // 奇数位*2 >9 的分割之后的数组十位数之和
  // var sumTotal = 0
  // for (var m = 0 m < arrJiShu.length m++) {
  //   sumJiShu = sumJiShu + parseInt(arrJiShu[m])
  // }

  // for (var n = 0 n < arrOuShu.length n++) {
  //   sumOuShu = sumOuShu + parseInt(arrOuShu[n])
  // }

  // for (var p = 0 p < jishu_child1.length p++) {
  //   sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p])
  //   sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p])
  // }
  // // 计算总和
  // sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2)

  // // 计算luhn值
  // var k = parseInt(sumTotal) % 10 === 0 ? 10 : parseInt(sumTotal) % 10
  // var luhn = 10 - k

  // if (lastNum === luhn) {
  //   return true
  // } else {
  //   return false
  // }
  return true
}

// 检查银行卡号
export function Checkvalue(rule, value, callback) {
  if (!value) {
    callback(new Error('此为必填项'))
  } else {
    var regValue = value.replace(/\s/g, '')
    if (regValue === '') {
      callback(new Error('请填写银行卡号'))
      return false
    }
    if (regValue.length < 16 || regValue.length > 19) {
      callback(new Error('银行卡号长度必须在16到19之间'))
      return false
    }
    var num = /^\d*$/ // 全数字
    if (!num.exec(regValue)) {
      callback(new Error('银行卡号必须全为数字'))
      return false
    }
    // 开头6位
    // var strBin = '10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99'
    // if (strBin.indexOf(regValue.substring(0, 2)) === -1) {
    //   callback(new Error('银行卡号开头6位不符合规范'))
    //   return false
    // }
    // Luhn校验
    if (!luhnCheck(regValue)) {
      callback(new Error('银行卡号必须符合luhn校验'))
    } else {
      callback()
    }
  }
}

// 四位数手机号验证码
export function checkPhoneCode(rule, value, callback) {
  if (value !== undefined && value !== null) {
    if (value.length < 4) {
      callback(new Error('请填写正确的验证码！验证码为4位数'))
    } else {
      callback()
    }
  } else {
    callback(new Error('此为必填项'))
  }
}

// 0-1之间的系数
export function checkCoefficient(rule, value, callback) {
  if (value !== undefined && value !== null && value.length !== 0) {
    if (value > 1) {
      callback(new Error('系数值为0-1之间的小数'))
    } else {
      callback()
    }
  } else {
    callback(new Error('此为必填项'))
  }
}

// 省市区选择框，至少选择到市级
export function checkCityLength(rule, value, callback) {
  if (value !== undefined && value !== null && value.length !== 0) {
    if (value.length < 2) {
      callback(new Error('至少选择到市级'))
    } else {
      callback()
    }
  } else {
    callback(new Error('此为必填项'))
  }
}

export function checkEmail(rule, value, callback) {
  if (value === '') {
    callback(new Error('请输入邮箱号'))
  } else if (/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/.test(value)) {
    callback()
  } else {
    callback(new Error('请输入正确的邮箱号'))
  }
}


// 活动时间范围，活动开始时间和结束时间范围为7天
export function discountsTimeScope(rule, value, callback) {
  if (value === undefined || value === '' || value === null || value.length === 0) {
    callback(new Error('此为必填项'))
  } else if (value.length > 1) {
    const nowTime = new Date()
    const val0 = new Date(value[0]).getTime()
    const val1 = new Date(value[1]).getTime()
    const scopeMore = (val1 - val0) > 7 * 24 * 60 * 60 * 1000
    const afterMonth = nowTime.getTime() + 30 * 24 * 60 * 60 * 1000

    if (value[1] < formatDate(nowTime, 'yyyy-MM-ddThh:mm:ss')) {
      callback(new Error('结束日期不能小于今日'))
    } else if (scopeMore) {
      callback(new Error('活动开始时间和结束时间范围为7天以内'))
    } else if (val1 > afterMonth) {
      callback(new Error('活动时间设置范围为一个月以内'))
    } else {
      callback()
    }
  }
}
// 活动时间范围
export function discountsTimeScope2(rule, value, callback) {
  if (value === undefined || value === '' || value === null || value.length === 0) {
    callback(new Error('此为必填项'))
  } else if (value.length > 1) {
    const nowTime = new Date()
    const startTime = new Date(Date.parse(value[1]))
    const endTime = new Date(Date.parse(formatDate(nowTime, 'yyyy-MM-dd')))
    if (startTime < endTime) {
      callback(new Error('结束日期不能小于今日'))
    } else {
      callback()
    }
  }
}
export function isURL(rule, value, callback) {

  var name = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/
  if (value === undefined || value === '' || value === null || value.length === 0) {
    callback(new Error('此为必填项'))
  } else if (!(name.test(value))) {
    callback(new Error('链接错误'))
  } else {
    callback()
  }
}
// 信用代码
export function companyCode(rule,value,callback) {
  if (value) {
    if (!/^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/g.test(value)) {
      callback(new Error('请填写正确的信用代码'))
    } else {
      callback()
    }
  }else {
    callback(new Error('此为必填项'))
  }
  
}
export default {
  email: [{
    required: true,
    validator: checkEmail,
    trigger: ['blur', 'change']
  }],
  isURL: [{
    required: true,
    validator: isURL,
    trigger: ['blur', 'change'],
  }],
  QQ: [{
    required: true,
    validator: QQV,
    trigger: ['blur', 'change']
  }],
  phone: [{
    required: true,
    pattern: /^1[3456789]\d{9}$/,
    message: '请填写正确的手机号',
    trigger: ['blur', 'change']
  }],
  numPot2: [{
    required: true,
    validator: checkNumPot2,
    trigger: ['blur', 'change']
  }],
  InterNum: [{
    required: true,
    validator: checkInterNum,
    trigger: ['blur', 'change']
  }],
  carId: [{
    required: true,
    message: '请输入车牌号',
    trigger: ['blur', 'change']
  }, {
    pattern: /(^[\u4E00-\u9FA5]{1}[A-Z0-9]{6}$)|(^[A-Z]{2}[A-Z0-9]{2}[A-Z0-9\u4E00-\u9FA5]{1}[A-Z0-9]{4}$)|(^[\u4E00-\u9FA5]{1}[A-Z0-9]{5}[挂学警军港澳]{1}$)|(^[A-Z]{2}[0-9]{5}$)|(^(08|38){1}[A-Z0-9]{4}[A-Z0-9挂学警军港澳]{1}$)/,
    message: '常规格式：晋B12345'
  }],
  name: [{
    required: true,
    message: '请输入用户名',
    trigger: ['blur', 'change']
  }, {
    min: 2,
    max: 5,
    message: '长度在 2 到 5 个字符'
  }, {
    pattern: /^[\u4E00-\u9FA5]+$/,
    message: '用户名只能为中文'
  }
    // { pattern:/^[a-zA-Z]w{1,4}$/, message: '以字母开头，长度在2-5之间， 只能包含字符、数字和下划线'}
  ],
  password: [{
    required: true,
    message: '请输入密码',
    trigger: ['blur', 'change']
  }, {
    min: 6,
    max: 20,
    message: '长度在 6 到 20 个字符'
  }],
  withdrawNum: [{
    required: true,
    validator: checkWithdrawNum,
    trigger: ['blur', 'change']
  }],
  required: [{
    validator: validateRequire,
    required: true,
    trigger: ['blur', 'change']
  }],
  copyRequired(message) {
    return [{
      validator: validateRequire,
      required: true,
      message,
      trigger: ['blur', 'change']
    }]
  },
  idCard: [{
    validator: checkIdCard,
    required: true,
    trigger: ['blur', 'change']
  }],
  timeScope: [{
    validator: validateTimeScope,
    required: true,
    trigger: ['blur']
  }],
  discountsTimeScope: [{
    validator: discountsTimeScope,
    required: true,
    trigger: ['blur', 'change']
  }],
  discountsTimeScope2: [{
    validator: discountsTimeScope2,
    required: true,
    trigger: ['blur', 'change', 'input']
  }],
  bankNo: [{
    validator: Checkvalue,
    required: true,
    trigger: ['blur', 'change']
  }],
  phoneCode: [{
    validator: checkPhoneCode,
    required: true,
    trigger: ['blur', 'change']
  }],
  coefficient: [{
    validator: checkCoefficient,
    required: true,
    trigger: ['blur', 'change']
  }],
  city: [{
    validator: checkCityLength,
    required: true,
    trigger: ['blur', 'change']
  }],
  userName: [{
    required: true,
    message: '请输入用户名',
    trigger: ['blur', 'change']
  }, {
    min: 5,
    max: 20,
    message: '长度在 5 到 20 个字符'
  }, {
    pattern: /^[a-zA-Z0-9_-]{5,20}$/,
    message: '用户名格式为数字、字母的组合'
  }]
}
